package ar.com.seminario.common.service.localization;

/**
 * Interfaz que debe implementar todo localizador de servicios. La idea es que este localizador
 * permita obtener una única instancia de un servicio a nivel de sistema para que pueda brindar la
 * funcionalidad requerida a diferentes solicitudes.
 * 
 * @author Barbalarga & Camarro & Costa Zini & Lamas & Lamas
 */
public interface IBeanLocator {

	/**
	 * Obtiene un bean del registro de beans.
	 * 
	 * @param <Bean> Tipo de bean a instanciar.
	 * @param beanId El identificador del bean a obtener.
	 * @param beanInterface La clase a la que debe castear el bean obtenido.
	 * @return Servicio obtenido.
	 */
	<Bean> Bean getBean(final String beanId, final Class<Bean> beanInterface);

	/**
	 * Método para obtener un bean que tiene una única implementación en el registro. Es importante
	 * destacar que sólo UN punto de bean debe implementar el mismo.
	 * 
	 * @param <Bean> Tipo de bean a instanciar.
	 * @param beanInterface La clase a la que debe castear el bean obtenido.
	 * @return Servicio obtenido.
	 */
	<Bean> Bean getBean(final Class<Bean> beanInterface);

	/**
	 * Obtiene un bean del registro de bean pasando parámetros a su constructor.
	 * 
	 * @param beanId El identificador del bean a obtener.
	 * @param args Parámetros del constructor.
	 * @return Bean obtenido.
	 */
	Object getBean(final String beanId, final Object... args);

}
